跳到主要内容

Go 的 TestMain

testing.M

看别人的项目中的单元测试中看到了以下用法

func TestMain(m *testing.M) {
// do something
code := m.Run()
// do something
os.Exit(code)
}

所以好奇这个 testing.M 是干啥的

进行测试之前需要初始化操作(例如打开连接),测试结束后,需要做清理工作(例如关闭连接)等等。这个时候就可以使用 TestMain()

它提供了一个 Run() 方法,里面运行包中的所有测试,且它返回一个传递给 os 的退出代码

最简单使用方式:

func TestMain(m *testing.M) {
os.Exit(m.Run())
}

使用例

package mypackagename

import (
"testing"
"os"
)

func TestMain(m *testing.M) {
log.Println("Do stuff BEFORE the tests!")
exitVal := m.Run()
log.Println("Do stuff AFTER the tests!")

os.Exit(exitVal)
}

func TestA(t *testing.T) {
log.Println("TestA running")
}

func TestB(t *testing.T) {
log.Println("TestB running")
}

输出:

$ go test -v  .\main_m_test.go

2021/12/15 23:40:06 Do stuff BEFORE the tests!
=== RUN TestA
2021/12/15 23:40:06 TestA running
--- PASS: TestA (0.00s)
=== RUN TestB
2021/12/15 23:40:06 TestB running
--- PASS: TestB (0.00s)
PASS
2021/12/15 23:40:06 Do stuff AFTER the tests!
ok command-line-arguments 0.041s

References

Why use TestMain for testing in Go?